package com.gts.sofa.bean;

import com.gts.sofa.pojo.Car;
import com.gts.sofa.pojo.Color;
import com.gts.sofa.pojo.Yellow;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

/**
 *  @Autowired 自动注入  当一个组件中需要另一个组件的时候，只需要在另一个组件上加上@Autowired  就可以获取到组件了
 *
 *    1） 优先按照类型去容器中找对应的组件 Yellow.class; applicationContext.getBean(Yellow.class);
 *    public class MyService {

        @Autowired
        Yellow yellow;

        }
 *
 *    2) 如果组件有多个就根据组件的id去容器里面找applicationContext.getBean("yellow")
 *
 *    3) 可以使用@Qualifier("yellow") 来明确的指定 需要注入的组件id 而不是 使用属性名来注入
 *
 *    4) 自动装配默认一定要将属性赋值好的 如果没有就报错，可以使用 @Autowired(required = false) 来设置属性能装上就装上没有装上
 *
 *          就拉到
 *
 *    5）@Primary 这注解让spring进行自动装配的时候默认使用首选的bean，也可以使用 @Qualifier 来指定bean
 *
 *          使用了@Primary 组件的属性就随便写了
 *           @Autowired(required = false)
 *           Yellow yellow3;
 *    6）使用在 方法上、构造器上、形参上
 *        2、方法    用在方法上，方法需要的参数值会从容器里面获取，创建当前类的对象时会调用set方法，会调用set方法完成 赋值
 *        3、构造器  如果组件只有一个有参构造器， @Autowired 可以省略掉，构造器的参数依然可以从容器中获取
 *        4、参数    @Autowired 可以省略,
 */
@Configuration
public class SpringBeanInfo  {

    //@Primary
    @Bean("yellow2")
    public Yellow getYellow(){
        Yellow yellow = new Yellow();
        yellow.setNum(2);
      return  yellow;
    };

    //这里不用加@Autowired 注解也可以加，car的值从容器中获取 这里的情况是经常会见到的
    @Bean
    public Color color(Car car){
        car.setColor("block");
        Color color = new Color();
        color.setCar(car);
        return color;

    }


}
